import eel
import base64
from PIL import Image
from wordcloud import WordCloud
from io import BytesIO


class WordCloudMaker:
    def set_file(self, name, text):
        self.__name = name
        self.__text = text

    def create(self):
        """
        wd对象生成词云
        :return:
        """

        lines = self.__text.split('\n')

        # 去掉空白字符，以及完全由空白字符组成的元素
        lines = [x.strip() for x in lines]
        # strip()删除头尾的字符，此外还有lstrip()和rstrip()
        # 去掉字符串中空白字符

        lines = list(filter(WordCloudMaker.__is_not_empty_str, lines))
        # 去掉空字符元素
        # filter生成一个迭代器，使用list()转化成一个list
        # list是将所有值放到内存，而迭代器是用一个取一个（来自博客园）

        lines = [x.replace(' ', '_') for x in lines]  # 替换词组中的空格，保持词组是一个整体（WorldCloud的识别按空格划分
        words = ' '.join(lines)  # 将每一个元素用' '连接起来，join()方法
        self.wd.generate(words)

    def to_file(self):
        """
        将生成结果保存成jpg图片
        :return:
        """
        self.wd.to_file(self.__name + '.jpg')

    def to_base64(self):
        """
        将生成结果转换成base64编码
        :return:
        """
        img = self.wd.to_image()  # Image.Image对象
        output_buffer = BytesIO()
        img.save(output_buffer, format='JPEG')
        Image.open(output_buffer)
        byte_data = output_buffer.getvalue()
        base64_str = base64.b64encode(byte_data)  # 二进制编码
        if not isinstance(base64_str, str):  # Python3
            base64_str = base64_str.decode()  # 将base64二进制编码转换成字符串
        base64_str = "data:image/jpeg;base64," + base64_str
        print(base64_str)
        return base64_str

    @staticmethod  # 因为要用filter所以得是静态
    def __is_not_empty_str(str):
        # 空字符会被认为是False
        return str

    def __init__(self):
        self.__name = None
        self.__text = None
        self.__width = 1000
        self.__height = 800
        self.wd = WordCloud(font_path='Song.TTF',
                            width=self.__width,
                            height=self.__height,
                            background_color='white'
                            )


if __name__ == '__main__':
    eel.init('web')

    w = WordCloudMaker()


    @eel.expose
    def wordcloud_base64(name, text):
        """
        生成文件名对应的词云图片，返回base64编码字符串
        :param text:
        :return:
        """
        w.set_file(name, text)
        w.create()
        return w.to_base64()


    eel.start('index.html', mode="edge")
